user-test-results.html

Report generated on 28-Jan-2026 at 18:22:03 by pytest-html v3.1.1

Summary

15 tests ran in 905.14 seconds.

6 passed, 0 skipped, 9 failed, 3 errors, 0 expected failures, 0 unexpected passes, 0 rerun

Results

Result Test Duration Links
Error tests/frontend/test_users.py::test_user_menu_click_user_menu_links_tc_id_c95102[Desktop]::setup 74.53
selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="64c51498-08b5-4583-b0ef-75f324ec7711")>, base_url = 'https://addons.allizom.org', session_auth = None
request = <SubRequest 'selenium' for <Function test_user_menu_click_user_menu_links_tc_id_c95102[Desktop]>>

@pytest.fixture(
scope="function",
params=[DESKTOP],
ids=["Desktop"],
)
def selenium(selenium, base_url, session_auth, request):
"""Fixture to set a custom resolution for tests running on Desktop
and handle browser sessions when needed"""
selenium.set_window_size(*request.param)
# establishing actions based on markers
create_session = request.node.get_closest_marker("create_session")
login = request.node.get_closest_marker("login")
clear_session = request.node.get_closest_marker("clear_session")
# this is used when we want to open an AMO page with a sessionid
# cookie (i.e. a logged-in user) already set
if create_session:
# need to set the url context if we want to apply a cookie
# in order to avoid InvalidCookieDomainException error
selenium.get(base_url)
# set the sessionid cookie
selenium.add_cookie(
{
"name": "sessionid",
"value": session_auth,
}
)
# this is used when we want to start the browser with a normal login
# mostly used for the scope of getting the session cookie and storing it for later use
if login:
home = Home(selenium, base_url).open().wait_for_page_to_load()
home.header.click_login()
home.wait.until(
EC.visibility_of_element_located((By.NAME, "email")),
message=f"FxA email input field was not displayed in {selenium.current_url}",
)
user = login.args[0]
> Login(selenium, base_url).account(user)

tests/conftest.py:146:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/desktop/frontend/login.py:92: in account
self.fxa_login(
pages/desktop/frontend/login.py:205: in fxa_login
self.wait.until(EC.url_contains("signin_totp_code"))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <selenium.webdriver.support.wait.WebDriverWait (session="64c51498-08b5-4583-b0ef-75f324ec7711")>, method = <function url_contains.<locals>._predicate at 0x105a284a0>, message = ''

def until(self, method, message: str = ""):
"""Calls the method provided with the driver as an argument until the \
return value does not evaluate to ``False``.

:param method: callable(WebDriver)
:param message: optional message for :exc:`TimeoutException`
:returns: the result of the last call to `method`
:raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
"""
screen = None
stacktrace = None

end_time = time.monotonic() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.monotonic() > end_time:
break
> raise TimeoutException(message, screen, stacktrace)
E selenium.common.exceptions.TimeoutException: Message:

venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException
-----------------------------Captured stdout setup------------------------------
The "click continue button" event occurred.
Error tests/frontend/test_users.py::test_user_edit_profile_tc_id_c4607[Desktop]::setup 75.30
selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="8689dc5c-d805-434e-ac90-857168cd7606")>, base_url = 'https://addons.allizom.org', session_auth = None
request = <SubRequest 'selenium' for <Function test_user_edit_profile_tc_id_c4607[Desktop]>>

@pytest.fixture(
scope="function",
params=[DESKTOP],
ids=["Desktop"],
)
def selenium(selenium, base_url, session_auth, request):
"""Fixture to set a custom resolution for tests running on Desktop
and handle browser sessions when needed"""
selenium.set_window_size(*request.param)
# establishing actions based on markers
create_session = request.node.get_closest_marker("create_session")
login = request.node.get_closest_marker("login")
clear_session = request.node.get_closest_marker("clear_session")
# this is used when we want to open an AMO page with a sessionid
# cookie (i.e. a logged-in user) already set
if create_session:
# need to set the url context if we want to apply a cookie
# in order to avoid InvalidCookieDomainException error
selenium.get(base_url)
# set the sessionid cookie
selenium.add_cookie(
{
"name": "sessionid",
"value": session_auth,
}
)
# this is used when we want to start the browser with a normal login
# mostly used for the scope of getting the session cookie and storing it for later use
if login:
home = Home(selenium, base_url).open().wait_for_page_to_load()
home.header.click_login()
home.wait.until(
EC.visibility_of_element_located((By.NAME, "email")),
message=f"FxA email input field was not displayed in {selenium.current_url}",
)
user = login.args[0]
> Login(selenium, base_url).account(user)

tests/conftest.py:146:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/desktop/frontend/login.py:87: in account
self.fxa_login(self.REUSABLE_USER_EMAIL, self.REUSABLE_USER_PASSWORD, "")
pages/desktop/frontend/login.py:223: in fxa_login
self.wait.until(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <selenium.webdriver.support.wait.WebDriverWait (session="8689dc5c-d805-434e-ac90-857168cd7606")>, method = <function url_contains.<locals>._predicate at 0x105873ec0>
message = 'AMO could not be loaded in https://accounts.firefox.com/oauth/signin?client_id=1e5a77cf09e5b4b5&scope=profile%2Bopeni...28282f7ea3fa672695faa90ac7949c5578ba7aa41f20e%3AL2VuLVVTL2ZpcmVmb3gv&access_type=offline. Response status code was 200'

def until(self, method, message: str = ""):
"""Calls the method provided with the driver as an argument until the \
return value does not evaluate to ``False``.

:param method: callable(WebDriver)
:param message: optional message for :exc:`TimeoutException`
:returns: the result of the last call to `method`
:raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
"""
screen = None
stacktrace = None

end_time = time.monotonic() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.monotonic() > end_time:
break
> raise TimeoutException(message, screen, stacktrace)
E selenium.common.exceptions.TimeoutException: Message: AMO could not be loaded in https://accounts.firefox.com/oauth/signin?client_id=1e5a77cf09e5b4b5&scope=profile%2Bopenid&state=70ea0c420dc84f5eed528282f7ea3fa672695faa90ac7949c5578ba7aa41f20e%3AL2VuLVVTL2ZpcmVmb3gv&access_type=offline. Response status code was 200

venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException
-----------------------------Captured stdout setup------------------------------
The "click continue button" event occurred.
Error tests/frontend/test_users.py::test_user_account_manage_section[Desktop]::setup 76.11
selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="acd4739b-1712-46b1-acba-0a651a093a66")>, base_url = 'https://addons.allizom.org', session_auth = None
request = <SubRequest 'selenium' for <Function test_user_account_manage_section[Desktop]>>

@pytest.fixture(
scope="function",
params=[DESKTOP],
ids=["Desktop"],
)
def selenium(selenium, base_url, session_auth, request):
"""Fixture to set a custom resolution for tests running on Desktop
and handle browser sessions when needed"""
selenium.set_window_size(*request.param)
# establishing actions based on markers
create_session = request.node.get_closest_marker("create_session")
login = request.node.get_closest_marker("login")
clear_session = request.node.get_closest_marker("clear_session")
# this is used when we want to open an AMO page with a sessionid
# cookie (i.e. a logged-in user) already set
if create_session:
# need to set the url context if we want to apply a cookie
# in order to avoid InvalidCookieDomainException error
selenium.get(base_url)
# set the sessionid cookie
selenium.add_cookie(
{
"name": "sessionid",
"value": session_auth,
}
)
# this is used when we want to start the browser with a normal login
# mostly used for the scope of getting the session cookie and storing it for later use
if login:
home = Home(selenium, base_url).open().wait_for_page_to_load()
home.header.click_login()
home.wait.until(
EC.visibility_of_element_located((By.NAME, "email")),
message=f"FxA email input field was not displayed in {selenium.current_url}",
)
user = login.args[0]
> Login(selenium, base_url).account(user)

tests/conftest.py:146:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/desktop/frontend/login.py:87: in account
self.fxa_login(self.REUSABLE_USER_EMAIL, self.REUSABLE_USER_PASSWORD, "")
pages/desktop/frontend/login.py:223: in fxa_login
self.wait.until(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <selenium.webdriver.support.wait.WebDriverWait (session="acd4739b-1712-46b1-acba-0a651a093a66")>, method = <function url_contains.<locals>._predicate at 0x1059d3600>
message = 'AMO could not be loaded in https://accounts.firefox.com/oauth/signin?client_id=1e5a77cf09e5b4b5&scope=profile%2Bopeni...638c97e745d7b5eba962c46e7e3567f9c68b42845c56f%3AL2VuLVVTL2ZpcmVmb3gv&access_type=offline. Response status code was 200'

def until(self, method, message: str = ""):
"""Calls the method provided with the driver as an argument until the \
return value does not evaluate to ``False``.

:param method: callable(WebDriver)
:param message: optional message for :exc:`TimeoutException`
:returns: the result of the last call to `method`
:raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
"""
screen = None
stacktrace = None

end_time = time.monotonic() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.monotonic() > end_time:
break
> raise TimeoutException(message, screen, stacktrace)
E selenium.common.exceptions.TimeoutException: Message: AMO could not be loaded in https://accounts.firefox.com/oauth/signin?client_id=1e5a77cf09e5b4b5&scope=profile%2Bopenid&state=7b832d30bb6e7172b3d638c97e745d7b5eba962c46e7e3567f9c68b42845c56f%3AL2VuLVVTL2ZpcmVmb3gv&access_type=offline. Response status code was 200

venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException
-----------------------------Captured stdout setup------------------------------
The "click continue button" event occurred.
Failed tests/frontend/test_users.py::test_user_menu_edit_profile_tc_id_c95102[Desktop] 74.64
base_url = 'https://addons.allizom.org', selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="9ad193f5-6823-466c-98a4-ff0d5a36c1f5")>

@pytest.mark.sanity
@pytest.mark.serial
@pytest.mark.nondestructive
def test_user_menu_edit_profile_tc_id_c95102(base_url, selenium):
"""Ensures that the "Edit Profile" option
in the user menu works and redirects to the correct page."""
page = Home(selenium, base_url).open().wait_for_page_to_load()
> page.login("regular_user")

tests/frontend/test_users.py:76:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/desktop/base.py:91: in login
fxa.account(user)
pages/desktop/frontend/login.py:166: in account
self.fxa_login(self.REGULAR_USER_EMAIL, self.REGULAR_USER_PASSWORD, "")
pages/desktop/frontend/login.py:223: in fxa_login
self.wait.until(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <selenium.webdriver.support.wait.WebDriverWait (session="9ad193f5-6823-466c-98a4-ff0d5a36c1f5")>, method = <function url_contains.<locals>._predicate at 0x105926700>
message = 'AMO could not be loaded in https://accounts.firefox.com/oauth/signin?client_id=1e5a77cf09e5b4b5&scope=profile%2Bopeni...1793eed2856df173200f7d64ba768b5bab2c707ec64d0%3AL2VuLVVTL2ZpcmVmb3gv&access_type=offline. Response status code was 200'

def until(self, method, message: str = ""):
"""Calls the method provided with the driver as an argument until the \
return value does not evaluate to ``False``.

:param method: callable(WebDriver)
:param message: optional message for :exc:`TimeoutException`
:returns: the result of the last call to `method`
:raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
"""
screen = None
stacktrace = None

end_time = time.monotonic() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.monotonic() > end_time:
break
> raise TimeoutException(message, screen, stacktrace)
E selenium.common.exceptions.TimeoutException: Message: AMO could not be loaded in https://accounts.firefox.com/oauth/signin?client_id=1e5a77cf09e5b4b5&scope=profile%2Bopenid&state=8534b21d25aefb645921793eed2856df173200f7d64ba768b5bab2c707ec64d0%3AL2VuLVVTL2ZpcmVmb3gv&access_type=offline. Response status code was 200

venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException
------------------------------Captured stdout call------------------------------
The "click continue button" event occurred.
Failed tests/frontend/test_users.py::test_user_developer_notifications[Desktop] 43.73
base_url = 'https://addons.allizom.org', selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="4f05eb89-2360-4fab-8b55-72d430e67bd3")>
variables = {'4mb_addon_slug': '4mb_addon_slug', 'addon_detail_guid': '{446900e4-71c2-419f-a6a7-df9c091e268b}', 'addon_detail_id':...dd-ons must comply with Mozilla’s Add-on Policies and are subject to manual review at any time after submission.', ...}
wait = <[AttributeError("'function' object has no attribute 'session_id'") raised in repr()] WebDriverWait object at 0x105a6c0d0>

@pytest.mark.serial
@pytest.mark.nondestructive
@pytest.mark.create_session("developer")
def test_user_developer_notifications(base_url, selenium, variables, wait):
"""Validates the notifications settings for a
developer user, ensuring all available options are listed."""
Home(selenium, base_url).open().wait_for_page_to_load()
user = User(selenium, base_url).open().wait_for_page_to_load()
# verifies that information messages about the scope of notifications are displayed
> assert variables["notifications_info_text"] in user.edit.notifications_info_text

tests/frontend/test_users.py:130:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/desktop/frontend/users.py:731: in notifications_info_text
self.wait.until(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <selenium.webdriver.support.wait.WebDriverWait (session="4f05eb89-2360-4fab-8b55-72d430e67bd3")>, method = <function visibility_of_element_located.<locals>._predicate at 0x1058716c0>, message = ''

def until(self, method, message: str = ""):
"""Calls the method provided with the driver as an argument until the \
return value does not evaluate to ``False``.

:param method: callable(WebDriver)
:param message: optional message for :exc:`TimeoutException`
:returns: the result of the last call to `method`
:raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
"""
screen = None
stacktrace = None

end_time = time.monotonic() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.monotonic() > end_time:
break
> raise TimeoutException(message, screen, stacktrace)
E selenium.common.exceptions.TimeoutException: Message:
E Stacktrace:
E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:202:5
E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:555:5
E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16

venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException
Failed tests/frontend/test_users.py::test_user_mandatory_notifications[Desktop] 43.25
base_url = 'https://addons.allizom.org', selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="35540115-705d-4091-9696-ee495739b7bd")>

@pytest.mark.serial
@pytest.mark.nondestructive
@pytest.mark.create_session("developer")
def test_user_mandatory_notifications(base_url, selenium):
"""Ensures that mandatory notifications for developers cannot be unchecked."""
Home(selenium, base_url).open().wait_for_page_to_load()
user = User(selenium, base_url).open().wait_for_page_to_load()
# notifications 5 to 7 are mandatory for developers; clicking the checkboxes should have no effect
> for checkbox in user.edit.notifications_checkbox[4:7]:

tests/frontend/test_users.py:153:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/desktop/frontend/users.py:741: in notifications_checkbox
message=f"There were {len(self.notification_text)} notifications displayed, expected 8",
pages/desktop/frontend/users.py:747: in notification_text
self.wait.until(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <selenium.webdriver.support.wait.WebDriverWait (session="35540115-705d-4091-9696-ee495739b7bd")>, method = <function visibility_of_element_located.<locals>._predicate at 0x105a299e0>, message = ''

def until(self, method, message: str = ""):
"""Calls the method provided with the driver as an argument until the \
return value does not evaluate to ``False``.

:param method: callable(WebDriver)
:param message: optional message for :exc:`TimeoutException`
:returns: the result of the last call to `method`
:raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
"""
screen = None
stacktrace = None

end_time = time.monotonic() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.monotonic() > end_time:
break
> raise TimeoutException(message, screen, stacktrace)
E selenium.common.exceptions.TimeoutException: Message:
E Stacktrace:
E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:202:5
E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:555:5
E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16

venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException
Failed tests/frontend/test_users.py::test_user_view_profile_tc_id_c452203[Desktop] 32.65
base_url = 'https://addons.allizom.org', selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="300d0683-3527-44be-a291-f9c33452bdf1")>
variables = {'4mb_addon_slug': '4mb_addon_slug', 'addon_detail_guid': '{446900e4-71c2-419f-a6a7-df9c091e268b}', 'addon_detail_id':...dd-ons must comply with Mozilla’s Add-on Policies and are subject to manual review at any time after submission.', ...}

@pytest.mark.sanity
@pytest.mark.serial
@pytest.mark.create_session("reusable_user")
def test_user_view_profile_tc_id_c452203(base_url, selenium, variables):
"""Confirms that the profile view displays
the correct information after editing."""
user = User(selenium, base_url).open().wait_for_page_to_load()
# opens the View profile page
> user.edit.click_view_profile_link()

tests/frontend/test_users.py:196:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/desktop/frontend/users.py:568: in click_view_profile_link
).until(EC.element_to_be_clickable(self._view_profile_link_locator))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <selenium.webdriver.support.wait.WebDriverWait (session="300d0683-3527-44be-a291-f9c33452bdf1")>, method = <function element_to_be_clickable.<locals>._predicate at 0x105924900>, message = ''

def until(self, method, message: str = ""):
"""Calls the method provided with the driver as an argument until the \
return value does not evaluate to ``False``.

:param method: callable(WebDriver)
:param message: optional message for :exc:`TimeoutException`
:returns: the result of the last call to `method`
:raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
"""
screen = None
stacktrace = None

end_time = time.monotonic() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.monotonic() > end_time:
break
> raise TimeoutException(message, screen, stacktrace)
E selenium.common.exceptions.TimeoutException: Message:
E Stacktrace:
E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:202:5
E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:555:5
E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16

venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException
Failed tests/frontend/test_users.py::test_user_change_profile_picture[Desktop] 32.19
base_url = 'https://addons.allizom.org', selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="c3e25b27-b73b-466d-afb5-58ee0285eeef")>
wait = <[AttributeError("'function' object has no attribute 'session_id'") raised in repr()] WebDriverWait object at 0x105b24550>

@pytest.mark.serial
@pytest.mark.create_session("reusable_user")
def test_user_change_profile_picture(base_url, selenium, wait):
"""Tests changing and verifying the user's profile picture."""
user = User(selenium, base_url).open().wait_for_page_to_load()
# opens the View profile page
> user.edit.click_view_profile_link()

tests/frontend/test_users.py:216:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/desktop/frontend/users.py:568: in click_view_profile_link
).until(EC.element_to_be_clickable(self._view_profile_link_locator))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <selenium.webdriver.support.wait.WebDriverWait (session="c3e25b27-b73b-466d-afb5-58ee0285eeef")>, method = <function element_to_be_clickable.<locals>._predicate at 0x105873c40>, message = ''

def until(self, method, message: str = ""):
"""Calls the method provided with the driver as an argument until the \
return value does not evaluate to ``False``.

:param method: callable(WebDriver)
:param message: optional message for :exc:`TimeoutException`
:returns: the result of the last call to `method`
:raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
"""
screen = None
stacktrace = None

end_time = time.monotonic() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.monotonic() > end_time:
break
> raise TimeoutException(message, screen, stacktrace)
E selenium.common.exceptions.TimeoutException: Message:
E Stacktrace:
E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:202:5
E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:555:5
E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16

venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException
Failed tests/frontend/test_users.py::test_user_delete_profile_picture[Desktop] 11.99
base_url = 'https://addons.allizom.org', selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="779919bc-4397-4eed-8f44-7dd279c02152")>

@pytest.mark.serial
@pytest.mark.create_session("reusable_user")
def test_user_delete_profile_picture(base_url, selenium):
"""Verifies that a user can delete their
profile picture and see the default avatar."""
user = User(selenium, base_url).open().wait_for_page_to_load()
> user.edit.delete_profile_picture()

tests/frontend/test_users.py:245:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/desktop/frontend/users.py:689: in delete_profile_picture
self.find_element(*self._delete_picture_button_locator).click()
venv/lib/python3.11/site-packages/pypom/region.py:106: in find_element
return self.driver_adapter.find_element(strategy, locator, root=self.root)
venv/lib/python3.11/site-packages/pypom/selenium_driver.py:61: in find_element
return self.driver.find_element(strategy, locator)
venv/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py:856: in find_element
return self.execute(Command.FIND_ELEMENT, {
venv/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py:429: in execute
self.error_handler.check_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x105cbf9d0>
response = {'status': 404, 'value': '{"value":{"error":"no such element","message":"Unable to locate element: .UserProfileEditPic.../content/shared/webdriver/Errors.sys.mjs:555:5\\ndom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16\\n"}}'}

def check_response(self, response: Dict[str, Any]) -> None:
"""
Checks that a JSON response from the WebDriver does not have an error.

:Args:
- response - The JSON response from the WebDriver server as a dictionary
object.

:Raises: If the response contains an error message.
"""
status = response.get('status', None)
if not status or status == ErrorCode.SUCCESS:
return
value = None
message = response.get("message", "")
screen: str = response.get("screen", "")
stacktrace = None
if isinstance(status, int):
value_json = response.get('value', None)
if value_json and isinstance(value_json, str):
import json
try:
value = json.loads(value_json)
if len(value.keys()) == 1:
value = value['value']
status = value.get('error', None)
if not status:
status = value.get("status", ErrorCode.UNKNOWN_ERROR)
message = value.get("value") or value.get("message")
if not isinstance(message, str):
value = message
message = message.get('message')
else:
message = value.get('message', None)
except ValueError:
pass

exception_class: Type[WebDriverException]
if status in ErrorCode.NO_SUCH_ELEMENT:
exception_class = NoSuchElementException
elif status in ErrorCode.NO_SUCH_FRAME:
exception_class = NoSuchFrameException
elif status in ErrorCode.NO_SUCH_SHADOW_ROOT:
exception_class = NoSuchShadowRootException
elif status in ErrorCode.NO_SUCH_WINDOW:
exception_class = NoSuchWindowException
elif status in ErrorCode.STALE_ELEMENT_REFERENCE:
exception_class = StaleElementReferenceException
elif status in ErrorCode.ELEMENT_NOT_VISIBLE:
exception_class = ElementNotVisibleException
elif status in ErrorCode.INVALID_ELEMENT_STATE:
exception_class = InvalidElementStateException
elif status in ErrorCode.INVALID_SELECTOR \
or status in ErrorCode.INVALID_XPATH_SELECTOR \
or status in ErrorCode.INVALID_XPATH_SELECTOR_RETURN_TYPER:
exception_class = InvalidSelectorException
elif status in ErrorCode.ELEMENT_IS_NOT_SELECTABLE:
exception_class = ElementNotSelectableException
elif status in ErrorCode.ELEMENT_NOT_INTERACTABLE:
exception_class = ElementNotInteractableException
elif status in ErrorCode.INVALID_COOKIE_DOMAIN:
exception_class = InvalidCookieDomainException
elif status in ErrorCode.UNABLE_TO_SET_COOKIE:
exception_class = UnableToSetCookieException
elif status in ErrorCode.TIMEOUT:
exception_class = TimeoutException
elif status in ErrorCode.SCRIPT_TIMEOUT:
exception_class = TimeoutException
elif status in ErrorCode.UNKNOWN_ERROR:
exception_class = WebDriverException
elif status in ErrorCode.UNEXPECTED_ALERT_OPEN:
exception_class = UnexpectedAlertPresentException
elif status in ErrorCode.NO_ALERT_OPEN:
exception_class = NoAlertPresentException
elif status in ErrorCode.IME_NOT_AVAILABLE:
exception_class = ImeNotAvailableException
elif status in ErrorCode.IME_ENGINE_ACTIVATION_FAILED:
exception_class = ImeActivationFailedException
elif status in ErrorCode.MOVE_TARGET_OUT_OF_BOUNDS:
exception_class = MoveTargetOutOfBoundsException
elif status in ErrorCode.JAVASCRIPT_ERROR:
exception_class = JavascriptException
elif status in ErrorCode.SESSION_NOT_CREATED:
exception_class = SessionNotCreatedException
elif status in ErrorCode.INVALID_ARGUMENT:
exception_class = InvalidArgumentException
elif status in ErrorCode.NO_SUCH_COOKIE:
exception_class = NoSuchCookieException
elif status in ErrorCode.UNABLE_TO_CAPTURE_SCREEN:
exception_class = ScreenshotException
elif status in ErrorCode.ELEMENT_CLICK_INTERCEPTED:
exception_class = ElementClickInterceptedException
elif status in ErrorCode.INSECURE_CERTIFICATE:
exception_class = InsecureCertificateException
elif status in ErrorCode.INVALID_COORDINATES:
exception_class = InvalidCoordinatesException
elif status in ErrorCode.INVALID_SESSION_ID:
exception_class = InvalidSessionIdException
elif status in ErrorCode.UNKNOWN_METHOD:
exception_class = UnknownMethodException
else:
exception_class = WebDriverException
if not value:
value = response['value']
if isinstance(value, str):
raise exception_class(value)
if message == "" and 'message' in value:
message = value['message']

screen = None # type: ignore[assignment]
if 'screen' in value:
screen = value['screen']

stacktrace = None
st_value = value.get('stackTrace') or value.get('stacktrace')
if st_value:
if isinstance(st_value, str):
stacktrace = st_value.split('\n')
else:
stacktrace = []
try:
for frame in st_value:
line = frame.get("lineNumber", "")
file = frame.get("fileName", "<anonymous>")
if line:
file = f"{file}:{line}"
meth = frame.get('methodName', '<anonymous>')
if 'className' in frame:
meth = "{}.{}".format(frame['className'], meth)
msg = " at %s (%s)"
msg = msg % (meth, file)
stacktrace.append(msg)
except TypeError:
pass
if exception_class == UnexpectedAlertPresentException:
alert_text = None
if 'data' in value:
alert_text = value['data'].get('text')
elif 'alert' in value:
alert_text = value['alert'].get('text')
raise exception_class(message, screen, stacktrace, alert_text) # type: ignore[call-arg] # mypy is not smart enough here
> raise exception_class(message, screen, stacktrace)
E selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: .UserProfileEditPicture-delete-button button
E Stacktrace:
E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:202:5
E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:555:5
E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16

venv/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py:243: NoSuchElementException
Failed tests/frontend/test_users.py::test_user_update_profile[Desktop] 44.46
base_url = 'https://addons.allizom.org', selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="3b46678b-6797-454c-b2e8-6e1d686c39f0")>
variables = {'4mb_addon_slug': '4mb_addon_slug', 'addon_detail_guid': '{446900e4-71c2-419f-a6a7-df9c091e268b}', 'addon_detail_id':...dd-ons must comply with Mozilla’s Add-on Policies and are subject to manual review at any time after submission.', ...}

@pytest.mark.serial
@pytest.mark.create_session("reusable_user")
def test_user_update_profile(base_url, selenium, variables):
"""Ensures that a user can update their profile fields,
including display name, biography, and location."""
user = User(selenium, base_url).open().wait_for_page_to_load()
updated_name = "new_display_name"
# update field
> user.edit.display_name_field.clear()

tests/frontend/test_users.py:266:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/desktop/frontend/users.py:616: in display_name_field
self.wait.until(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <selenium.webdriver.support.wait.WebDriverWait (session="3b46678b-6797-454c-b2e8-6e1d686c39f0")>, method = <function visibility_of_element_located.<locals>._predicate at 0x105925c60>, message = ''

def until(self, method, message: str = ""):
"""Calls the method provided with the driver as an argument until the \
return value does not evaluate to ``False``.

:param method: callable(WebDriver)
:param message: optional message for :exc:`TimeoutException`
:returns: the result of the last call to `method`
:raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
"""
screen = None
stacktrace = None

end_time = time.monotonic() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.monotonic() > end_time:
break
> raise TimeoutException(message, screen, stacktrace)
E selenium.common.exceptions.TimeoutException: Message:
E Stacktrace:
E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:202:5
E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:555:5
E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16

venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException
Failed tests/frontend/test_users.py::test_user_update_url[Desktop] 42.25
base_url = 'https://addons.allizom.org', selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="6757fc4e-6189-42b5-b3ab-3890dc7c1013")>
variables = {'4mb_addon_slug': '4mb_addon_slug', 'addon_detail_guid': '{446900e4-71c2-419f-a6a7-df9c091e268b}', 'addon_detail_id':...dd-ons must comply with Mozilla’s Add-on Policies and are subject to manual review at any time after submission.', ...}

@pytest.mark.serial
@pytest.mark.create_session("reusable_user")
def test_user_update_url(base_url, selenium, variables):
"""Tests that the user’s homepage URL field is validated for correctness."""
user = User(selenium, base_url).open().wait_for_page_to_load()
initial_page_url = selenium.current_url
# test not a URL, this should not pass the client validation
# it should not submit, red error message should not be displayed
> user.edit.homepage_link_field.clear()

tests/frontend/test_users.py:290:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/desktop/frontend/users.py:629: in homepage_link_field
self.wait.until(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <selenium.webdriver.support.wait.WebDriverWait (session="6757fc4e-6189-42b5-b3ab-3890dc7c1013")>, method = <function visibility_of_element_located.<locals>._predicate at 0x105aba840>, message = ''

def until(self, method, message: str = ""):
"""Calls the method provided with the driver as an argument until the \
return value does not evaluate to ``False``.

:param method: callable(WebDriver)
:param message: optional message for :exc:`TimeoutException`
:returns: the result of the last call to `method`
:raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
"""
screen = None
stacktrace = None

end_time = time.monotonic() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.monotonic() > end_time:
break
> raise TimeoutException(message, screen, stacktrace)
E selenium.common.exceptions.TimeoutException: Message:
E Stacktrace:
E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:202:5
E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:555:5
E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16

venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException
Failed tests/frontend/test_users.py::test_user_delete_profile_tc_id_c4393[Desktop] 42.39
base_url = 'https://addons.allizom.org', selenium = <selenium.webdriver.firefox.webdriver.WebDriver (session="0181e215-8cf8-4beb-981d-6f024e212611")>

@pytest.mark.sanity
@pytest.mark.serial
@pytest.mark.create_session("reusable_user")
def test_user_delete_profile_tc_id_c4393(base_url, selenium):
"""Verifies that a user can delete their
account and be redirected to the homepage."""
user = User(selenium, base_url).open().wait_for_page_to_load()
> user.edit.delete_account()

tests/frontend/test_users.py:321:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/desktop/frontend/users.py:787: in delete_account
self.wait.until(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <selenium.webdriver.support.wait.WebDriverWait (session="0181e215-8cf8-4beb-981d-6f024e212611")>, method = <function element_to_be_clickable.<locals>._predicate at 0x105aba020>, message = ''

def until(self, method, message: str = ""):
"""Calls the method provided with the driver as an argument until the \
return value does not evaluate to ``False``.

:param method: callable(WebDriver)
:param message: optional message for :exc:`TimeoutException`
:returns: the result of the last call to `method`
:raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
"""
screen = None
stacktrace = None

end_time = time.monotonic() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.monotonic() > end_time:
break
> raise TimeoutException(message, screen, stacktrace)
E selenium.common.exceptions.TimeoutException: Message:
E Stacktrace:
E RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
E WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:202:5
E NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:555:5
E dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16

venv/lib/python3.11/site-packages/selenium/webdriver/support/wait.py:90: TimeoutException
Passed tests/frontend/test_users.py::test_login[Desktop] 51.45
------------------------------Captured stdout call------------------------------
The "click continue button" event occurred.
Passed tests/frontend/test_users.py::test_logout_tc_id_c95092[Desktop] 60.39
------------------------------Captured stdout call------------------------------
The "click continue button" event occurred.
Passed tests/frontend/test_users.py::test_user_menu_collections_link_tc_id_c95102[Desktop] 54.49
------------------------------Captured stdout call------------------------------
The "click continue button" event occurred.
Passed tests/frontend/test_users.py::test_user_menu_view_profile_tc_id_c95102[Desktop] 54.54
------------------------------Captured stdout call------------------------------
The "click continue button" event occurred.
Passed tests/frontend/test_users.py::test_register_new_account[Desktop] 64.79
------------------------------Captured stdout call------------------------------

Passed tests/frontend/test_users.py::test_user_data_for_deleted_profile[Desktop] 12.21
No log output captured.